import java.util.List;

import javax.swing.JOptionPane;

public class Controle {

    public static void main(String[] args) {

	String conteudo = "";

	String str = JOptionPane.showInputDialog(null, "Teste ", 1);

	if (str != null)
	    conteudo = str;

	Lexico lexico = new Lexico();
	SemanticoIterativo semantico = new SemanticoIterativo();
	Sintatico sintatico = new Sintatico();

	lexico.setInput(conteudo);

	try {
	    sintatico.parse(lexico, semantico);

	} catch (LexicalError e) {
	    e.printStackTrace();

	} catch (SyntaticError e) {
	    e.printStackTrace();

	} catch (SemanticError e) {
	    e.printStackTrace();
	}

	int numeroEnder = semantico.getIterativa().getC0().size();

	for (int i = 0; i < numeroEnder; i++) {

	    Integer c1 = semantico.getIterativa().getC1().get(i + 1);
	    Integer c2 = semantico.getIterativa().getC2().get(i + 1);
	    Integer c3 = semantico.getIterativa().getC3().get(i + 1);
	    Integer c4 = semantico.getIterativa().getC4().get(i + 1);
	    Integer c5 = semantico.getIterativa().getC5().get(i + 1);

	    // System.out.println(semantico.getIterativa().getC0().get(i) + " "
	    //+ c1 + " " + c2 + " " + c3 + " " + c4 + " " + c5);

	    System.out.println(transformarEmMonolitico(i + 1, c1, c2, c3, c4,
		    c5));
	}

	List<Integer> c0 = semantico.getIterativa().getC0();
	System.out.println(c0.size() + 1 + ": retorna");
    }

    private static String transformarEmMonolitico(int indice, Integer c1,
	    Integer c2, Integer c3, Integer c4, Integer c5) {

	if (c1 == 1) {
	    return operacaoTeste(indice, c1, c4, c5);

	}
	if (c1 == 2) {
	    return operacaoAtribuicaoRegistrador(indice, c1, c3, c4);

	}
	if (c1 == 3) {
	    return operacaoIncremento(indice, c2, c4);

	} else {
	    return operacaoDecremento(indice, c2, c4);
	}
    }

    private static String operacaoTeste(int indice, Integer c1, Integer c4,
	    Integer c5) {

	return indice + ": se T entao va_para " + c4 + " senao va_para " + c5;
    }

    private static String operacaoAtribuicaoRegistrador(int indice, Integer c1,
	    Integer c3, Integer c4) {

	return indice + ": faca rt = r" + c3 + " va_para " + c4;
    }

    private static String operacaoIncremento(int indice, Integer c2, Integer c4) {

	return indice + ": faca inc(r" + c2 + ") va_para " + c4;
    }

    private static String operacaoDecremento(int indice, Integer c2, Integer c4) {

	return indice + ": faca dec(r" + c2 + ") va_para " + c4;
    }

}
